#region << 版 本 注 释 >>
/*----------------------------------------------------------------
 * 版权所有 (c) 2025   保留所有权利。
 * CLR版本：4.0.30319.42000
 * 机器名称：DESKTOP-GLJ2Q8J
 * 公司名称：
 * 命名空间：AutoCAD.EntityTools.Ribbon
 * 唯一标识：3662c8ac-7a19-4021-a6f8-82722d48fb44
 * 文件名：PaletteHelper
 * 当前用户域：DESKTOP-GLJ2Q8J
 * 
 * 创建者： Guo_79991
 * 电子邮箱：xxxx@hotmail.com
 * 创建时间：2025/8/31 13:44:16
 * 版本：V1.0.0
 * 描述：
 *
 * ----------------------------------------------------------------
 * 修改人：
 * 时间：
 * 修改说明：
 *
 * 版本：V1.0.1
 *----------------------------------------------------------------*/
#endregion << 版 本 注 释 >>



namespace AutoCAD.EntityTools.Ribbon
{
    /// <summary>
    /// PaletteHelper 的摘要说明
    /// </summary>
    public class PaletteHelper : PaletteSet
    {
        protected System.Windows.Controls.UserControl _customControl;
        protected string _paletteName;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name">面板名称</param>
        /// <param name="control">自定义用户控件</param>
        public PaletteHelper(string name, System.Windows.Controls.UserControl control = null) : base(name)
        {
            _paletteName = name;
            _customControl = control ?? CreateDefaultControl();

            InitializePalette();
        }

        /// <summary>
        /// 初始化面板（可重写）
        /// </summary>
        protected virtual void InitializePalette()
        {
            // 设置面板属性
            this.Style = PaletteSetStyles.ShowCloseButton;
            this.MinimumSize = new Size(200, 300);
            this.Size = new Size(250, 600);

            // 设置停靠属性
            this.Dock = DockSides.Left;
            this.DockEnabled = DockSides.Left;

            // 添加自定义控件
            AddCustomControl();

            // 应用额外配置
            ApplyAdditionalSettings();
        }

        /// <summary>
        /// 创建默认控件（可重写）
        /// </summary>
        protected virtual System.Windows.Controls.UserControl CreateDefaultControl()
        {
            return new PaletteView(); // 默认控件
        }

        /// <summary>
        /// 添加自定义控件
        /// </summary>
        protected virtual void AddCustomControl()
        {
            if (_customControl != null)
            {
                this.AddVisual(_paletteName, _customControl);
            }
        }

        /// <summary>
        /// 应用额外设置（可重写）
        /// </summary>
        protected virtual void ApplyAdditionalSettings()
        {
            this.Visible = true;
            this.Location = new Point(0, 0);
        }

        /// <summary>
        /// 显示面板
        /// </summary>
        /// <summary>
        /// 显示面板
        /// </summary>
        public virtual void ShowPalette()
        {
            try
            {
                this.Visible = true;

                // 激活第一个页面（索引0）
                if (this.Count > 0)
                {
                    this.Activate(0); // 需要指定页面索引
                }

                ApplyDockPosition();
            }
            catch (System.Exception ex)
            {
                System.Windows.MessageBox.Show($"显示面板失败: {ex.Message}");
            }
        }
        /// <summary>
        /// 隐藏面板
        /// </summary>
        public virtual void HidePalette()
        {
            this.Visible = false;
        }

        /// <summary>
        /// 切换面板显示状态
        /// </summary>
        public virtual void TogglePalette()
        {
            if (this.Visible)
            {
                HidePalette();
            }
            else
            {
                ShowPalette();
            }
        }

        /// <summary>
        /// 应用停靠位置
        /// </summary>
        /// <summary>
        /// 应用停靠位置
        /// </summary>
        protected virtual void ApplyDockPosition()
        {
            try
            {
                // 方法1：直接设置（大多数情况下有效）
                this.Dock = DockSides.Left;
                this.DockEnabled = DockSides.Left;

                // 方法2：使用AutoCAD的同步上下文
                var syncContext = System.Threading.SynchronizationContext.Current;
                if (syncContext != null)
                {
                    syncContext.Post(_ =>
                    {
                        try
                        {
                            this.Dock = DockSides.Left;
                            this.DockEnabled = DockSides.Left;

                            // 强制重绘
                            if (this.Visible)
                            {
                                this.Visible = false;
                                this.Visible = true;
                            }
                        }
                        catch
                        {
                            // 忽略错误
                        }
                    }, null);
                }
            }
            catch
            {
                // 忽略错误
            }
        }

        /// <summary>
        /// 获取或设置自定义控件
        /// </summary>
        public System.Windows.Controls.UserControl CustomControl
        {
            get => _customControl;
            set
            {
                _customControl = value;
                RefreshControl();
            }
        }

        /// <summary>
        /// 刷新控件显示
        /// </summary>
        /// <summary>
        /// 刷新控件显示
        /// </summary>
        protected virtual void RefreshControl()
        {
            try
            {
                // 方法1：使用Clear方法清除所有页面（如果可用）
                // 注意：PaletteSet可能没有Clear方法，需要检查

                // 方法2：通过索引逐个移除页面
                while (this.Count > 0)
                {
                    this.Remove(0); // 从索引0开始移除
                }

                // 方法3：使用反射调用内部方法（如果需要）
                // ClearPagesUsingReflection();

                // 添加新控件
                AddCustomControl();
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show($"刷新控件失败: {ex.Message}");
            }
        }

        /// <summary>
        /// 使用反射清除所有页面（备选方案）
        /// </summary>
        private void ClearPagesUsingReflection()
        {
            try
            {
                var field = typeof(PaletteSet).GetField("m_tabPages",
                    System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                if (field != null)
                {
                    var pages = field.GetValue(this) as System.Collections.IList;
                    pages?.Clear();
                }
            }
            catch
            {
                // 忽略反射错误
            }
        }
    }
}
